package com.lry.jvm.instructions.refrences;

import com.lry.jvm.instructions.base.Index16Instruction;
import com.lry.jvm.rtda.Frame;
import com.lry.jvm.rtda.JObject;
import com.lry.jvm.rtda.OperandStack;
import com.lry.jvm.rtda.heap.ClassRef;
import com.lry.jvm.rtda.heap.JClass;
import com.lry.jvm.rtda.heap.RuntimeConstantPool;
import com.lry.jvm.util.Util;

//创建引用类型数组
//anewarray指令也需要两个操作数。第一个操作数是uint16索 引，来自字节码。
//        通过这个索引可以从当前类的运行时常量池中找 到一个类符号引用
//        ，解析这个符号引用就可以得到数组元素的类。
//        第二个操作数是数组长度，从操作数栈中弹出
public class anewarray extends Index16Instruction {
    @Override
    public byte getOpCode() {
        return (byte) 0xbd;
    }

    @Override
    public void execute(Frame frame) {
        RuntimeConstantPool rcp = frame.getMethod().getJClass().getConstantPool();
        //从常量池获取数组的引用类型
        ClassRef classRef = (ClassRef) rcp.getConstant(index);

        JClass componentClass = classRef.resolvedClass();
        OperandStack stack = frame.getOperandStack();
        int len = stack.popInt();
        if(len<0){
            Util.panic("java.lang.NegativeArraySizeException");
        }
        JClass arrClass = componentClass.arrayClass();
        JObject arr = arrClass.newArray(len);
        stack.pushRef(arr);
    }
}
